package cn.hncu.booksManagementSystem.book.dao.impl;

import java.util.ArrayList;
import java.util.Collection;

import cn.hncu.booksManagementSystem.book.dao.dao.BookDAO;
import cn.hncu.booksManagementSystem.book.vo.BookModel;
import cn.hncu.booksManagementSystem.book.vo.BookQueryModel;
import cn.hncu.booksManagementSystem.common.enums.XxxIdEnum;
import cn.hncu.booksManagementSystem.utils.FileIoUtil;
import cn.hncu.booksManagementSystem.utils.GeneratorXxxID_Util;
/**
 * 
 * CreateTime: 2018年4月19日 下午3:46:21	
 * @author 宋进宇  Email:447441478@qq.com
 * Description:
 *	BookDAO接口实现类
 */
public class BookDAO_FileImpl implements BookDAO {
	//数据源
	private final String FILE_NAME = "./data/book.info";
	
	@Override
	public boolean add(BookModel book) {
		//如果被添加的图书值对象为null，则返回false
		if (book==null) {
			return false;
		}
		//先获取所有图书对象
		Collection<BookModel> col = FileIoUtil.readFromDataBase(FILE_NAME);
		//遍历整个集合
		for (BookModel b : col) {
			//如果找到相同的对象则表示已存在，返回false
			if (b.equals(book)) {
				return false;
			}
		}
		//能到这里，说明book是新的图书则可以添加
		boolean boo=col.add(book);
		//产生下一个图书id
		GeneratorXxxID_Util.updateXxxId(XxxIdEnum.BOOK);;
		return boo&&FileIoUtil.write2DataBase(col, FILE_NAME);
	}

	@Override
	public boolean delete(BookModel book) {
		//如果book为null，则不能删除返回false
		if (book==null) {
			return false;
		}
		Collection<BookModel> col = FileIoUtil.readFromDataBase(FILE_NAME);
		//遍历整个集合
		for (BookModel b : col) {
			//找到相同的对象，并删除
			if (b.equals(book)) {
				boolean boo=col.remove(book);
				return boo&&FileIoUtil.write2DataBase(col, FILE_NAME);
			}
		}
		//能到这里说明不存在 book 值对象
		return false;
	}

	@Override
	public boolean update(BookModel book) {
		//如果book为null，则返回false
		if (book==null) {
			return false;
		}
		//从数据库中把数据读取出来
		Collection<BookModel> col = FileIoUtil.readFromDataBase(FILE_NAME);
		//进行强转，以便替换（利用ArrayList中get/set方法）
		ArrayList<BookModel> list = (ArrayList<BookModel>) col;
		boolean boo = false;
		for(int i =0;i<list.size();i++) {
			//如果找到相同id的图书，就修改
			if (list.get(i).equals(book)) {
				list.set(i, book);
				boo = true;
				break;
			}
		}
		col = list;
		return boo&&FileIoUtil.write2DataBase(list, FILE_NAME);
	}

	@Override
	public BookModel getUserModelById(String id) {
		//如果id为null，则不存在返回null
		if (id==null) {
			return null;
		}
		Collection<BookModel> col = FileIoUtil.readFromDataBase(FILE_NAME);
		for (BookModel book : col) {
			if (book.getId().equals(id)) {
				//找到就返回图书值对象
				return book;
			}
		}
		return null;
	}

	@Override
	public Collection<BookModel> getAll() {
		//直接读取全部数据返回
		return FileIoUtil.readFromDataBase(FILE_NAME);
	}

	@Override
	public Collection<BookModel> getUsersByCondition(BookQueryModel bqm) {
		//获得所有数据
		Collection<BookModel> col = getAll();
		//如果查询值对象为空则查询所有
		if (bqm==null) {
			return col;
		}
		//创建一个结果集
		Collection<BookModel> res = new ArrayList<BookModel>();
		//遍历所有整个col集合，找到符合条件的元素加入结果集
		//才用卫条件，反逻辑
		for (BookModel book : col) {
			//卫条件1 查id 精确查询
			//判断查询条件是否有效
			if (bqm.getId()!=null&&bqm.getId().trim().length()>0) {
				//能到这里说明查询条件有效
				//反逻辑：不符合条件的跳过
				if (!book.getId().trim().equals(bqm.getId().trim())) {
					continue;
				}
			}
			//卫条件2 查名称 模糊查询
			//判断查询条件是否有效
			if (bqm.getName()!=null&&bqm.getName().trim().length()>0) {
				//能到这里说明查询条件有效
				//反逻辑：不符合条件的跳过
				if (!book.getName().contains(bqm.getName().trim())) {
					continue;
				}
			}
			//卫条件3 查进价 范围查询  反逻辑 ：小于小的大于大的
			//判断查询条件是否有效
			if (bqm.getInPrice()>0) {
				//小于小的就跳过
				if (book.getInPrice()<bqm.getInPrice()) {
					continue;
				}
			}
			//判断查询条件是否有效
			if (bqm.getInPrice2()>0) {
				//大于大的就跳过
				if (book.getInPrice()>bqm.getInPrice2()) {
					continue;
				}
			}
			//卫条件4 查售价 范围查询  反逻辑 ：小于小的大于大的
			//判断查询条件是否有效
			if (bqm.getOutPrice()>0) {
				//小于小的就跳过
				if (book.getOutPrice()<bqm.getOutPrice()) {
					continue;
				}
			}
			//判断查询条件是否有效
			if (bqm.getOutPrice2()>0) {
				//大于大的就跳过
				if (book.getOutPrice()>bqm.getOutPrice2()) {
					continue;
				}
			}
			//能到这里说明是符合条件的
			res.add(book);
		}
		return res;
	}

}
